www.gusucode.com > VC++ 自定义窗体右键或左键的声音信息-源码程序 > VC++ 自定义窗体右键或左键的声音信息-源码程序/code/Wave.cpp

    //Download by http://www.NewXing.com
// Wave.cpp


#include "stdafx.h"
#include "Wave.h"

CWave::CWave()
{

	InitVars();

}

CWave::CWave( const char *lpszFilename )
{

	InitVars();
	Load( lpszFilename );

}

CWave::CWave( const char *lpszResID, HINSTANCE hInstance )
{

	InitVars();
	Load( lpszResID, hInstance );

}

CWave::CWave( int nResID, HINSTANCE hInstance )
{

	InitVars();
	Load( nResID, hInstance );

}

void CWave::InitVars( void )
{

	m_bLoaded = FALSE;
	m_lpSoundData = NULL;
	m_hResHandle = NULL;
	m_nDevices = waveOutGetNumDevs();

}

CWave::~CWave()
{

	Close();

}

int CWave::DeviceCount( void )
{

	return( m_nDevices );

}

BOOL CWave::IsLoaded( void )
{

	return( m_bLoaded );

}

BOOL CWave::Load( const char *lpszFilename )
{

	Close();

	CFile File;
	if( !File.Open( lpszFilename, CFile::modeRead ) )
		return( FALSE );

	DWORD dwFileLength = File.GetLength();
	m_lpSoundData = new char [dwFileLength];
	if( m_lpSoundData == NULL )
		return( FALSE );

	if( File.Read( m_lpSoundData, dwFileLength )
		!= dwFileLength )
		return( FALSE );

	m_bLoaded = TRUE;

	return( TRUE );

}

BOOL CWave::Load( const char *lpszResID, HINSTANCE hInstance )
{

	Close();

	HANDLE hResInfo;
	hResInfo = FindResource ( hInstance, lpszResID, "WAVE" );
	if( hResInfo == NULL )
		return( FALSE );

	m_hResHandle = LoadResource( hInstance, (HRSRC) hResInfo );
	if( m_hResHandle == NULL )
		return( FALSE );

	m_lpSoundData = (char *) LockResource( m_hResHandle );
	if( m_lpSoundData == NULL )
		return( FALSE );

	m_bLoaded = TRUE;

	return( TRUE );

}

BOOL CWave::Load( int nResID, HINSTANCE hInstance )
{

	Close();

	HANDLE hResInfo;
	hResInfo = FindResource ( hInstance,
		MAKEINTRESOURCE( nResID ), "WAVE" );
	if( hResInfo == NULL )
		return( FALSE );

	m_hResHandle = LoadResource( hInstance, (HRSRC) hResInfo );
	if( m_hResHandle == NULL )
		return( FALSE );

	m_lpSoundData = (char *) LockResource( m_hResHandle );
	if( m_lpSoundData == NULL )
		return( FALSE );

	m_bLoaded = TRUE;

	return( TRUE );

}

BOOL CWave::Play( BOOL bLoop )
{

	if( !m_bLoaded )
		return( FALSE );

	Stop();
	
	DWORD dwFlags = SND_MEMORY | SND_ASYNC | SND_NODEFAULT;
	if( bLoop )
		dwFlags |= SND_LOOP;

	return( PlaySound( m_lpSoundData, NULL, dwFlags ) );

}

BOOL CWave::PlayFromDisk( const char *lpszFilename )
{

	Stop();
	
	return( PlaySound( lpszFilename, NULL,
		SND_FILENAME | SND_SYNC | SND_NODEFAULT ) );

}

BOOL CWave::PlayFromRes( const char *lpszResID,
						HINSTANCE hInstance )
{

	return( PlaySound( lpszResID, hInstance,
		SND_RESOURCE | SND_SYNC | SND_NODEFAULT ) );

}

BOOL CWave::PlayFromRes( int nResID, HINSTANCE hInstance )
{

	return( PlaySound( MAKEINTRESOURCE( nResID ),
		hInstance, SND_RESOURCE | SND_SYNC | SND_NODEFAULT ) );

}

BOOL CWave::Stop( void )
{

	return( PlaySound( NULL, NULL, NULL ) );

}

BOOL CWave::Close( void )
{

	Stop();

	if( m_hResHandle  != NULL ){
		UnlockResource( m_hResHandle );
		FreeResource( m_hResHandle );
		}
	else if( m_lpSoundData != NULL )
		delete [] m_lpSoundData;

	m_hResHandle = NULL;
	m_lpSoundData = NULL;

	return( TRUE );

}